﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __XOS_ODBC_ODBC_FIELDS_H__
#define __XOS_ODBC_ODBC_FIELDS_H__

#include "../tools/head.h"
#include "include_odbc.h"
#include "odbc_field.h"

namespace xos_odbc
{

    class odbc_fields : public xos_stl::mem_item< xos::release_impl< odbc_fields >, thread_lock >,
		public i_fields
    {
    public:
        typedef xos::release_impl< odbc_fields > T;

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //
        static int get_addr( POOL *** pppPool, LIST *** pppList );

    public:
        odbc_fields();
        ~odbc_fields();

    protected:
        odbc_field::LIST field_list;
        odbc_field * m_pKey;

        std::string m_table_name;
        std::string m_sql;

        i_dbc * m_pConnect;
        i_stmt * m_pStmt;

    public:
        int set_connect( i_dbc * lpConnect );
        int init();
        int term();

    protected:
        int init_data();

    public:
        // 
        // 添加整数字段
        // 
        int push( const char * lpszName, xos::xos_i32 * lpData, bool bIsKey );
        // 
        // 添加长整数字段
        // 
        int push( const char * lpszName, xos::xos_i64 * lpData );
        // 
        // 添加短整数字段
        // 
        int push( const char * lpszName, xos::xos_i16 * lpData );
        // 
        // 添加字节字段
        // 
        int push( const char * lpszName, xos::xos_i8 * lpData );
        // 
        // 添加整数字段
        // 
        int push( const char * lpszName, xos::xos_u32 * lpData, bool bIsKey );
        // 
        // 添加长整数字段
        // 
        int push( const char * lpszName, xos::xos_u64 * lpData );
        // 
        // 添加短整数字段
        // 
        int push( const char * lpszName, xos::xos_u16 * lpData );
        // 
        // 添加字节字段
        // 
        int push( const char * lpszName, xos::xos_u8 * lpData );
        // 
        // 添加bool字段
        // 
        int push( const char * lpszName, bool * lpData );
        // 
        // 添加字串字段
        // 
        int push( const char * lpszName, char * lpData, int nBufSize );
        // 
        // 添加float字段
        // 
        int push( const char * lpszName, float * lpData, int nDigitNum );
        // 
        // 添加double字段
        // 
        int push( const char * lpszName, double * lpData, int nDigitNum );

        // 
        // 设置为更改过
        // 
        int set_dirty( const char * lpszName );
        // 
        // 设置为更改过
        // 
        int set_dirty( int nIndex );
        // 
        // 设置为更改过
        // 
        int set_all_dirty();
        // 
        // 恢复为没改过
        // 
        int clear_dirty( const char * lpszName );
        // 
        // 恢复为没改过
        // 
        int clear_dirty( int nIndex );
        // 
        // 恢复为没改过
        // 
        int clear_all_dirty();

        // 
        // 设置表名
        // 
        int set_table_name( const char * lpszTableName );

        //
        // 编译sql
        // 
        //  0 : success. 
        //  1 : running. 
        // -1 : failed
        // 
        int prepare_sql();
        int execute();
        int clear();
        // 
        //  0 : success
        //  1 : pending
        //  2 : no data
        // -1 : failed
        // 
        int fetch();

        // 
        // 准备查询
        // 
        // lpszSql说明：
        // 
        //  not null : where子句。如：where id = 1
        //      null : 全表查询
        // 
        int prepare_query( const char * lpszSql );
        int bind_query();
        // 
        // 准备修改
        // 
        int prepare_update();
        // 
        // 准备添加
        // 
        int prepare_add();
        // 
        // 准备删除
        // 
        int prepare_del();
        // 
        // 帮助方法
        // 
        int set_id( xos::xos_i32 id );
        const char * sql();

    };

} // xos_odbc

#endif // __XOS_ODBC_ODBC_FIELDS_H__
